C语言中的 free() 函数理解 您所在的位置:网站首页 fc c语言 C语言中的 free() 函数理解

C语言中的 free() 函数理解

2023-09-01 13:33| 来源: 网络整理| 查看: 265

C语言中的 free() 函数理解 C语言当中 free() 函数与 malloc() 函数应是成对出现的: malloc() 函数负责空间的申请, malloc() 函数的对头free() 函数则负责将 malloc() 函数申请的空间给释放掉; #include #include #define MALLOC_SIZE 250 int main(void) { //申请一段长度为250,类型为 char 的空间 char *pointer = null; pointer = (char *)malloc( MALLOC_SIZE * sizeof(char) ); //释放空间 if(null != pointer) { free( pointer ); pointer = null; } return 0; }

以上是个申请空间又释放掉的显得闲得蛋疼的例子,那问题来了:

free() 函数是如何确定要释放空间大小的?free() 函数释放掉的是什么内容呢?指针 pointer 不指向 null 行不行?不判断 null != pointer 是否必要?free( pointer + 1),能否释放?

以下为个人的理解: 第一点:申请空间的大小是由用户决定的,系统有基于链表的内存管理,申请得到的空间在物理空间上不一定连续的,但申请到的空间映射出的虚拟空间是连续的,申请空间时,对于系统来说,系统只会关注申请空间的大小,并不关注空间类型,所以申请空间返回的空间也不具有特定的空间类型,只是分配了一段空间供用户使用; malloc函数返回来的是申请到空间的地址,然后用户使用一个指针指向这块空间,便可以使用了;在申请到空间的开始地址前的空间会记录着空间的大小,因此在 free() 释放空间时会先去确认空间的大小,再进行空间释放。 第二点: 在这里插入图片描述 空间结构的大致图示,假设此时指针 pointer 指向空间首地址0x0001,空间中存用户想要存储的数据,调用 free( pointer ) 函数,会将空间的内存给释放掉,也算是将空间的使用权给释放掉,释放后用户无法合法访问这段空间,释放掉后的空间存储的数据是随机值,释放后的空间可在下次申请空间时循环使用,若使用完之后空间不释放,则这块空间无法归还给系统,无法再次利用,导致内存泄漏; 第三点:调用调用 free( pointer ) 函数,指针 pointer 是不会被释放掉的,即便释放空间后,指针 pointer 还是指向地址0x0001的地方,释放后再继续调用指针则会越界,为了避免此类错误,最好在释放空间后将指针指向null; 第四点:释放空间前最好先判断一下 null != pointer ,因为有可能出现系统空间不足导致申请空间失败的情况,也就无法进行空间释放了; 第五点:free( pointer + 1) 是无法释放空间的,因为申请空间的地址不匹配了,而且无法找到这段空间大小的记录,导致释放空间失败;只有地址与申请空间的首地址匹配,系统查找到合理的空间长度记录才会进行空间释放操作;



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有